home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / newmake.arc / MACRO.C < prev    next >
Text File  |  1986-09-21  |  2KB  |  126 lines

  1. #include <stdio.h>
  2. #include "make.h"
  3.  
  4. /*
  5.  * Macro processing
  6.  */
  7.  
  8.  
  9. /*
  10.  * Perform macro substitution from 'orig' to 'dest'.
  11.  * Return number of macro substitutions made.
  12.  * A macro reference is in one of two forms:
  13.  *        <MACCHAR>(macro-name)
  14.  *    or    <MACCHAR><single-character>
  15.  *
  16.  * "<MACCHAR><MACCHAR>" expands to a single '<MACCHAR>'
  17.  */
  18. mexpand(orig, dest, destsiz, macchar)
  19. char *orig, *dest;
  20. int destsiz;
  21. char macchar;
  22. {
  23.     char *s, *d, mname[STRSIZ];
  24.     int di, count;
  25.     MACRO *m;
  26.  
  27.     di = count = 0;
  28.     for(s=orig; *s;)
  29.         if(*s == macchar)
  30.         {
  31.             if(*++s == macchar)
  32.             {
  33.                 if(di < destsiz-1) dest[di++] = *s++;
  34.                 continue;
  35.             }
  36.  
  37.             if(!*s) break;
  38.             d = mname;
  39.             if(*s != '(') *d++ = *s++;
  40.             else
  41.             {
  42.                 for(++s; *s && *s!=')';) *d++ = *s++;
  43.                 if(*s != ')') puts("Missed matching ')'");
  44.                 else ++s;
  45.             }
  46.             *d = 0;
  47.             if((d = gmacro(mname)) == NULL)
  48.                 fprintf(stderr, "Undefined macro: %s\n", mname);
  49.             else
  50.             {
  51.                 while(*d && di < (destsiz - 1))
  52.                     dest[di++] = *d++;
  53.                 ++count;
  54.             }
  55.         } else if(di < destsiz-1)
  56.             dest[di++] = *s++;
  57.  
  58.     dest[di]=0;
  59.     return count;
  60. }
  61.  
  62.  
  63. /*
  64.  * Define a macro.
  65.  * Give the macro called 'name' the string expansion 'def'.
  66.  * Old macro-names are superseded, NOT replaced.
  67.  * Return ERROR if can't define the macro.
  68.  */
  69. defmac(name, def)
  70. char *name, *def;
  71. {
  72.     MACRO *m;
  73.  
  74.     if((m = (MACRO *)malloc(sizeof(MACRO))) == NULL) allerr();
  75.     if((m->mname = (char *)malloc(strlen(name)+1)) == NULL) allerr();
  76.     if((m->mvalue = (char *)malloc(strlen(def)+1)) == NULL) allerr();
  77.  
  78.     strcpy(m->mname, name);
  79.     strcpy(m->mvalue, def);
  80.     m->mnext = mroot;
  81.     mroot = m;
  82. }
  83.  
  84.  
  85. /*
  86.  * undefmac - undefine a macro.
  87.  * Return 0 if macro was succesfully undefined, -1 if not found.
  88.  */
  89. undefmac(name)
  90. char *name;
  91. {
  92.     MACRO *m = mroot;
  93.     MACRO *prev = NULL;
  94.  
  95.     while(m != NULL && strcmp(name, m->mname))
  96.     {
  97.         prev = m;
  98.         m = m->mnext;
  99.     }
  100.  
  101.     if(m == NULL) return -1;
  102.     if(prev == NULL) mroot = m->mnext;
  103.         else prev->mnext = m->mnext;
  104.  
  105.     free(m->mname);
  106.     free(m->mvalue);
  107.     free(m);
  108.     return 0;
  109. }
  110.  
  111.  
  112. /*
  113.  * Lookup a macro called 'name'.
  114.  * Return a pointer to its definition,
  115.  * or NULL if it does not exist.
  116.  */
  117. char *gmacro(name)
  118. char *name;
  119. {
  120.     MACRO *m;
  121.  
  122.     for(m=mroot; m != NULL; m=m->mnext)
  123.         if(!strcmp(name, m->mname)) return m->mvalue;
  124.     return NULL;
  125. }
  126.